<?php
namespace Common\Common;
include_once("WxPayPubHelper/WxPayPubHelper.php");
include_once("WxPayPubHelper/WxPay.pub.config.php");
include_once("WxPayPubHelper/WxPay.Micropay.config.php");
include_once("WxPayPubHelper/WxPayMicropayHelper.php");
/**
 * 微信支付
 */
class Wxpay{
    /*
     * JS-API微信支付——获取支付参数
     * js_api_call_url：授权url
     * body：商品描述
     * out_trade_no：商户订单号
     * money：总金额
     */
    function get_jsApiParameters($param=array('openid'=>'','body'=>'','out_trade_no'=>'','total_fee'=>'','notify_url'=>''))
    {

        /**
         * JS_API支付demo
         * ====================================================
         * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
         * 成功调起支付需要三个步骤：
         * 步骤1：网页授权获取用户openid
         * 步骤2：使用统一支付接口，获取prepay_id
         * 步骤3：使用jsapi调起支付
         */

        //使用jsapi接口
        $jsApi = new \JsApi_pub();

        //=========步骤1：网页授权获取用户openid============
        //通过code获得openid
        /*if (!isset($_GET['code']))
        {
            //触发微信返回code码
            $url = $jsApi->createOauthUrlForCode($param['js_api_call_url']);
            Header("Location: $url");
        }else
        {
            //获取code码，以获取openid
            $code = $_GET['code'];
            $jsApi->setCode($code);
            $openid = $jsApi->getOpenId();
        }*/

        //=========步骤2：使用统一支付接口，获取prepay_id============
        //使用统一支付接口
        $unifiedOrder = new \UnifiedOrder_pub();

        //设置统一支付接口参数
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //spbill_create_ip已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $unifiedOrder->setParameter("openid",$param['openid']);//用户openid
        $unifiedOrder->setParameter("body",$param['body']);//商品描述
        $unifiedOrder->setParameter("out_trade_no",$param['out_trade_no']);//商户订单号
        $unifiedOrder->setParameter("total_fee",$param['total_fee']);//总金额
        $unifiedOrder->setParameter("notify_url",$param['notify_url']);//通知地址
        $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
        //非必填参数，商户可根据实际情况选填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
        //$unifiedOrder->setParameter("device_info","XXXX");//设备号
        //$unifiedOrder->setParameter("attach","XXXX");//附加数据
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
        //$unifiedOrder->setParameter("openid","XXXX");//用户标识
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID

        $prepay_id = $unifiedOrder->getPrepayId();
        //=========步骤3：使用jsapi调起支付============
        $jsApi->setPrepayId($prepay_id);

        $jsApiParameters = $jsApi->getParameters();
        return $jsApiParameters;
    }

    /**
     * 微信红包查询
     */
    function get_hb_info($param=array()){
        $red_pack=new \Get_hbinfo();

        foreach ($param as $key=>$val)
        {
            $red_pack->setParameter("$key","$val");
        }
        $result=$red_pack->getResult();
        return $result;
    }

    /**
     * 发起红包并返回结果
     */
    function get_red_pack_result($param=array()){
        $red_pack=new \Red_pack();

        foreach ($param as $key=>$val)
        {
            $red_pack->setParameter("$key","$val");
        }
        $result=$red_pack->getResult();
        return $result;
    }

    /*
     * native（原生）支付-模式二，动态生成二维码
     */
    function dynamic_qrcode($param=array('body'=>'','out_trade_no'=>'','total_fee'=>'','notify_url'=>WxPayConf_pub::NOTIFY_URL)){
        //使用统一支付接口
        $unifiedOrder = new \UnifiedOrder_pub();

        //设置统一支付接口参数
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //spbill_create_ip已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $unifiedOrder->setParameter("body",$param['body']);//商品描述
        $unifiedOrder->setParameter("out_trade_no",$param['out_trade_no']);//商户订单号
        $unifiedOrder->setParameter("total_fee",$param['total_fee']);//总金额
        $unifiedOrder->setParameter("notify_url",$param['notify_url']);//通知地址
        $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
        //非必填参数，商户可根据实际情况选填
        //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
        //$unifiedOrder->setParameter("device_info","XXXX");//设备号
        //$unifiedOrder->setParameter("attach","XXXX");//附加数据
        //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
        //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
        //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
        //$unifiedOrder->setParameter("openid","XXXX");//用户标识
        //$unifiedOrder->setParameter("product_id","XXXX");//商品ID

        //获取统一支付接口结果
        $unifiedOrderResult = $unifiedOrder->getResult();

        //商户根据实际情况设置相应的处理流程
        if ($unifiedOrderResult["return_code"] == "FAIL")
        {
            //商户自行增加处理流程
            echo "通信出错：".$unifiedOrderResult['return_msg']."<br>";
            return false;
        }
        elseif($unifiedOrderResult["result_code"] == "FAIL")
        {
            //商户自行增加处理流程
            echo "错误代码：".$unifiedOrderResult['err_code']."<br>";
            echo "错误代码描述：".$unifiedOrderResult['err_code_des']."<br>";
            return false;
        }
        elseif($unifiedOrderResult["code_url"] != NULL)
        {
            //从统一支付接口获取到code_url
            $code_url = $unifiedOrderResult["code_url"];
            return $code_url;
        }
        return false;
    }

    /*
     * 微信刷卡支付
     */
    function micropay_call($param=array('body'=>'','out_trade_no'=>'','total_fee'=>'','auth_code'=>'')){

        //使用被扫支付接口
        $micropayCall = new \MicropayCall();

        //设置被扫支付接口参数
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //spbill_create_ip已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $micropayCall->setParameter("body",$param['body']);//商品描述
        $micropayCall->setParameter("out_trade_no",$param['out_trade_no']);//商户订单号
        $micropayCall->setParameter("total_fee",$param['total_fee']);//总金额
        $micropayCall->setParameter("auth_code",$param['auth_code']);//交易类型
        //非必填参数，商户可根据实际情况选填
        //$micropayCall->setParameter("sub_mch_id","XXXX");//子商户号
        //$micropayCall->setParameter("device_info","XXXX");//设备号
        //$micropayCall->setParameter("attach","XXXX");//附加数据
        //$micropayCall->setParameter("time_start","XXXX");//交易起始时间
        //$micropayCall->setParameter("time_expire","XXXX");//交易结束时间
        //$micropayCall->setParameter("goods_tag","XXXX");//商品标记
        //$micropayCall->setParameter("openid","XXXX");//用户标识
        //$micropayCall->setParameter("product_id","XXXX");//商品ID

        //提交订单
        $micropayCallResult = $micropayCall->getResult();

        //商户根据实际情况设置相应的处理流程,此处仅作举例
        if ($micropayCallResult["return_code"] == "FAIL") {
            //echo "通信出错：".$micropayCallResult['return_msg']."<br>";
            $micropayCallResult['errno']=0;
        }
        elseif($micropayCallResult["result_code"] == "FAIL"){
            /*echo "出错"."<br>";
            echo "错误代码：".$micropayCallResult['err_code']."<br>";
            echo "错误代码描述：".$micropayCallResult['err_code_des']."<br>";*/
            $micropayCallResult['errno']=0;
            //用户支付中
            if($micropayCallResult['err_code']=='USERPAYING'){
                $micropayCallResult['errno']=1;
            }
        }
        else{
            /*echo "用户标识：".$micropayCallResult['openid']."<br>";
            echo "是否关注公众账号：".$micropayCallResult['is_subscribe']."<br>";
            echo "交易类型：".$micropayCallResult['trade_type']."<br>";
            echo "付款银行：".$micropayCallResult['bank_type']."<br>";
            echo "总金额：".$micropayCallResult['total_fee']."<br>";
            echo "现金券金额：".$micropayCallResult['coupon_fee']."<br>";
            echo "货币种类：".$micropayCallResult['fee_type']."<br>";
            echo "微信支付订单号：".$micropayCallResult['transaction_id']."<br>";
            echo "商户订单号：".$micropayCallResult['out_trade_no']."<br>";
            echo "商家数据包：".$micropayCallResult['attach']."<br>";
            echo "支付完成时间：".$micropayCallResult['time_end']."<br>";
            return $micropayCallResult;*/
            $micropayCallResult['errno']=2;
        }
        return $micropayCallResult;
    }

    /**
     * 该接口提供所有微信支付订单的查询。
     * 当支付通知处理异常或丢失的情况，商户可以通过该接口查询订单支付状态。
     */
    function order_query($out_trade_no){
        //使用订单查询接口
        $orderQuery = new \OrderQuery_micropay();
        //设置必填参数
        //appid已填,商户无需重复填写
        //mch_id已填,商户无需重复填写
        //noncestr已填,商户无需重复填写
        //sign已填,商户无需重复填写
        $orderQuery->setParameter("out_trade_no","$out_trade_no");//商户订单号
        //非必填参数，商户可根据实际情况选填
        //$orderQuery->setParameter("sub_mch_id","XXXX");//子商户号
        //$orderQuery->setParameter("transaction_id","XXXX");//微信订单号

        //获取订单查询结果
        $orderQueryResult = $orderQuery->getResult();

        //商户根据实际情况设置相应的处理流程,此处仅作举例
        if ($orderQueryResult["return_code"] == "FAIL") {
//            echo "通信出错：".$orderQueryResult['return_msg']."<br>";
            $orderQueryResult['errno']=0;
        }
        elseif($orderQueryResult["result_code"] == "FAIL"){
            /*echo "错误代码：".$orderQueryResult['err_code']."<br>";
            echo "错误代码描述：".$orderQueryResult['err_code_des']."<br>";*/
            $orderQueryResult['errno']=0;
        }
        else{
            /*echo "交易状态：".$orderQueryResult['trade_state']."<br>";
            echo "设备号：".$orderQueryResult['device_info']."<br>";
            echo "用户标识：".$orderQueryResult['openid']."<br>";
            echo "是否关注公众账号：".$orderQueryResult['is_subscribe']."<br>";
            echo "交易类型：".$orderQueryResult['trade_type']."<br>";
            echo "付款银行：".$orderQueryResult['bank_type']."<br>";
            echo "总金额：".$orderQueryResult['total_fee']."<br>";
            echo "现金券金额：".$orderQueryResult['coupon_fee']."<br>";
            echo "货币种类：".$orderQueryResult['fee_type']."<br>";
            echo "微信支付订单号：".$orderQueryResult['transaction_id']."<br>";
            echo "商户订单号：".$orderQueryResult['out_trade_no']."<br>";
            echo "商家数据包：".$orderQueryResult['attach']."<br>";
            echo "支付完成时间：".$orderQueryResult['time_end']."<br>";*/
            $orderQueryResult['errno']=0;
            if($orderQueryResult['trade_state']=='USERPAYING'){
                $orderQueryResult['errno']=1;
            }
            if($orderQueryResult['trade_state']=='SUCCESS'){
                $orderQueryResult['errno']=2;
            }
        }
        return $orderQueryResult;
    }
}
?>